package com.bbs.sessionbean;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.bbs.domain.Boete;

/**
 * Session Bean implementation class BBSSB
 */
@Stateless
@LocalBean
public class BBSSB implements BBSSBLocal {
	@PersistenceContext(unitName = "week3_opdracht4")
	private EntityManager em;

    /**
     * Default constructor. 
     */
    public BBSSB() {
    }
	
	public int getBoete(int bsn, boolean vijftig, int tehard, Date datum){
		int bedrag = 0;
		
		//Huidige boete
		Boete boete = getBoeteByOverschrijding(tehard);
		
		//Behaalde zwartepunten tot nu toe voor afgelopen jaar ophalen
		long zwaartepunten = getTotaalZwaartepunten(datum, bsn);
		//Zwaartepunt voor huidige boete erbij optellen
		zwaartepunten += boete.getZwaartepunt();
		
		/*
		 * Bepaling voor daadwerkelijke boete:
		 * - Als binnen 50km zone: +100%
		 * - Als meer dan 5 zwaartepunten: *(aantal zwaartepunten teveel +50%)
		 */
		
		if(vijftig){
			//Boete bedrag + 100% van het boetebedrag
			bedrag += boete.getBedrag()*2;
		}
		
		if(zwaartepunten > 5){
			//Teveel aan zwaartepunten meenemen
			bedrag += bedrag*((zwaartepunten-5) * 50)/100;
		}
		
		return bedrag;
	}
	
	private Boete getBoeteByOverschrijding(int tehard) {
		Query q = em.createQuery("SELECT b FROM Boete b WHERE b.van <= :tehard AND b.tot >= :tehard");
		q.setParameter("tehard", tehard);
		return (Boete) q.getSingleResult();
	}
	
	public long getTotaalZwaartepunten(Date datum, int bsn) {
		//1 jaar van datum van overtreding aftrekken
		GregorianCalendar gc = new GregorianCalendar();
		gc.setTime(datum);
		gc.add(Calendar.YEAR, -1);		
		datum = gc.getTime();
		
		Query q = em.createQuery("SELECT SUM(b.zwaartepunt) FROM Overtreding o JOIN o.boete b " +
				"WHERE o.bsn = :bsn AND o.datum >= :datum");
		q.setParameter("bsn", bsn);
		q.setParameter("datum", datum);
		return (long) q.getSingleResult();
	}

}
